package main

import (
	"EditToServer/libs"
	"bufio"
	"embed"
	"fmt"
	"os"
	"path/filepath"
	"strings"

	"github.com/fsnotify/fsnotify"
)

//go:embed EditToServer.php
var embeddedFiles embed.FS

func main() {
	libs.PrintProductInfo()

	// 检查并提取 EditToServer.php 文件
	EditToServerPath := "EditToServer.php"
	if !libs.FileExists(EditToServerPath) {
		if err := extractAndModifyEditToServerFile(EditToServerPath); err != nil {
			fmt.Printf("提取并修改 EditToServer.php 文件失败: %v\n", err)
			return
		}
		fmt.Println("已提取 EditToServer.php 文件,请将其上传到服务器作为接收端。")
	}

	if !libs.FileExists("EditToServer.json") {
		libs.CreateDefaultConfig()
		fmt.Println("已创建默认配置文件 EditToServer.json。请修改配置后再运行程序。")
		fmt.Println("按任意键退出...")
		bufio.NewReader(os.Stdin).ReadBytes('\n')
		return
	}
	libs.LoadConfig()

	// 检查本地目录是否存在
	if !libs.FileExists(libs.Config.LocalPath) {
		fmt.Println("配置的本地目录不存在。请选择一个有效的目录：")
		newPath := libs.SelectLocalDir()
		if newPath != "" {
			libs.Config.LocalPath = newPath
			libs.Config.SaveConfig()
		} else {
			fmt.Println("未选择有效目录，程序退出。")
			return
		}
	}
	fmt.Printf("当前本地目录：%s\n", libs.Config.LocalPath)
	libs.SelectRemoteDir()

	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		fmt.Printf("创建监听器失败: %v\n", err)
		return
	}
	defer watcher.Close()

	go libs.WatchFiles(watcher)

	err = filepath.Walk(libs.Config.LocalPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if info.IsDir() {
			return watcher.Add(path)
		}
		return nil
	})
	if err != nil {
		fmt.Printf("添加监听目录失败: %v\n", err)
		return
	}

	fmt.Printf("开始监听同步 %s ===> %s \n", libs.Config.LocalPath, libs.Config.RemotePath)
	select {}
}

func extractAndModifyEditToServerFile(filePath string) error {
	content, err := embeddedFiles.ReadFile("EditToServer.php")
	if err != nil {
		return fmt.Errorf("读取嵌入的 EditToServer.php 文件失败: %w", err)
	}

	// 生成新的 AUTH_KEY
	newKey := libs.GenerateKey()

	// 获取设备码并进行双重 MD5 哈希
	deviceCode := libs.GetMachineID()
	doubleHashedDeviceCode := libs.GetDoubleMD5Hash(deviceCode)

	// 替换 AUTH_KEY 和 LISTEN_CHECK
	newContent := strings.Replace(string(content),
		`define('AUTH_KEY', "############################");`,
		fmt.Sprintf(`define('AUTH_KEY', "%s");`, newKey),
		1)

	newContent = strings.Replace(newContent,
		`define('LISTEN_CHECK', "############################");`,
		fmt.Sprintf(`define('LISTEN_CHECK', "%s");`, doubleHashedDeviceCode),
		1)

	// 写入修改后的内容到文件
	err = os.WriteFile(filePath, []byte(newContent), 0644)
	if err != nil {
		return fmt.Errorf("写入修改后的 EditToServer.php 文件失败: %w", err)
	}

	return nil
}
